package com.songtech.base.universal.service;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.cursor.Cursor;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.songtech.base.universal.dao.BaseDao;
import com.songtech.base.universal.dao.beans.Where;

/**
 * 通用service
 * <br>在controller中通过传入自定义的mybatis配置文件的方法和相应的map可以实现无特殊service处理的增删改查
 * <br>service的注入格式：@Resource(name = "com.songtech.universalservice.model.UniversalTest_service")，
 * <br>com.songtech.universalservice.model.UniversalTest是要注入service处理的entity对象，“_service”用于区分与基础dao注入的bean名字
 * <br>map对象：与自定义的mybatis中的#{}对应
 * <br>传入的方法名：mybatis的命名空间 + “.” + 方法名(namespace + "." + methodName)
 * <br>注意：UniversalService只能在controller中使用
 * @param <T>
 */
public interface BaseService<T extends Object> extends BaseDao<T> {
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis添加数据
	 * @param methodName 需要调用的mybatis添加方法
	 * @return 
	 * @throws SQLException 
	 */
	Integer insert(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis添加数据
	 * @param methodName 需要调用的mybatis添加方法
	 * @param map 参数对象
	 * @return 
	 * @throws SQLException 
	 */
	Integer insert(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis修改数据
	 * @param methodName 需要调用的mybatis修改方法
	 * @return
	 * @throws SQLException 
	 */
	Integer update(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis修改数据
	 * @param methodName 需要调用的mybatis修改方法
	 * @param map 参数对象，可以传null
	 * @return
	 * @throws SQLException 
	 */
	Integer update(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis删除数据
	 * @param methodName 需要调用的mybatis删除方法
	 * @return
	 * @throws SQLException 
	 */
	Integer delete(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis删除数据
	 * @param methodName 需要调用的mybatis删除方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	Integer delete(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	Object selectOne(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	Object selectOne(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	Object selectOneUseRedis(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询一条数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	Object selectOneUseRedis(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	List<?> selectList(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	List<?> selectList(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	PageInfo<?> selectList(String methodName, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	PageInfo<?> selectList(String methodName, Map<String, ?> map, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	List<?> selectListUseRedis(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	List<?> selectListUseRedis(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	PageInfo<?> selectListUseRedis(String methodName, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	PageInfo<?> selectListUseRedis(String methodName, Map<String, ?> map, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	List<?> selectMap(String methodName, String key) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	List<?> selectMap(String methodName, Map<String, ?> map, String key) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	PageInfo<?> selectMap(String methodName, String key, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	PageInfo<?> selectMap(String methodName, Map<String, ?> map, String key, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	List<?> selectMapUseRedis(String methodName, String key) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @return map将转为List后返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合
	 * @throws SQLException 
	 */
	List<?> selectMapUseRedis(String methodName, Map<String, ?> map, String key) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	PageInfo<?> selectMapUseRedis(String methodName, String key, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>调用自定义的mybatis查询数据
	 * <br>使用redis缓存
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param key 每一个查询到的对象保存到map中的key值，对于保存到map中的key的值等于该条数据指定key对应的字段的值
	 * <br>1、mybatis的mapper指定的返回类型为resultMap，key值为resultMap指定的result标签中的property的值(绑定实体的属性名称)
	 * <br>如：<result column="name_test" property="name" jdbcType="VARCHAR" />指定的property="name"，传入的key值应传入“name”
	 * <br>返回类型为resultMap，key=指定的实体属性的名字
	 * <br>2、mybatis的mapper指定的返回类型为resultType，key值为数据表对应的字段名
	 * <br>返回类型为resultType，key=数据表对应的字段名
	 * @param page 分页标签，可以传null
	 * @return map将转为List后组装为PageInfo对象返回
	 * <br>mybatis的mapper指定的返回类型为resultMap时，返回的是mapper指定的类的list集合组装的PageInfo对象
	 * <br>mybatis的mapper指定的返回类型为resultType时，返回的是多个map(key=表的字段，value=字段对应的值)组成的list集合的PageInfo对象
	 * @throws SQLException 
	 */
	PageInfo<?> selectMapUseRedis(String methodName, Map<String, ?> map, String key, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	Cursor<?> selectCursor(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	Cursor<?> selectCursor(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>使用redis缓存
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @return
	 * @throws SQLException 
	 */
	Cursor<?> selectCursorUseRedis(String methodName) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>大数据游标查询
	 * <br>使用redis缓存
	 * <br>查询存在异常，暂不使用
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	Cursor<?> selectCursorUseRedis(String methodName, Map<String, ?> map) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>分页查询
	 * <br>调用BaseDao中的查询方法
	 * @param obj
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException
	 */
	PageInfo<T> select(T obj, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>分页查询
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param obj
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException
	 */
	PageInfo<T> selectUseRedis(T obj, Page<?> page) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>条件查询
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param obj
	 * @return
	 * @throws SQLException
	 */
	List<T> selectUseRedis(T obj) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>条件查询
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param where
	 * @return
	 * @throws SQLException
	 */
	List<T> selectUseRedis(Where where) throws SQLException;
	
	/**
	 * 通用service类UniversalService
	 * <br>通过主键获取记录
	 * <br>调用BaseDao中的查询方法
	 * <br>使用redis缓存
	 * @param id 主键
	 * @return Object
	 * @throws SQLException 
	 */
	T selectByIdUseRedis(Serializable id) throws SQLException;
}
